<script>
  /* for (var i = 0; i < 5; i++) {
    console.log(i); // 0、1、2、3、4
  } */

  /* for (var i = 0; i < 5; i++) {
    // 0 秒打印 i
    // 1 秒打印 i
    // 2 秒打印 i
    // 3 秒打印 i
    // 4 秒打印 i
    // i 是在异步代码中打印的，当打印的时候 i 早就变成 5 了
    setTimeout(function () {
      console.log(i);
    }, 1000 * i);
  } */

  /* for (var i = 0; i < 5; i++) {
    ;(function (i) {
      // 0 秒打印 i
      // 1 秒打印 i
      // 2 秒打印 i
      // 3 秒打印 i
      // 4 秒打印 i
      setTimeout(function () {
        // 这儿形成了闭包，符合一个函数使用了外部函数的局部变量
        console.log(i);
      }, i * 1000);
    })(i);
  } */


  /* for (var i = 0; i < 5; i++) {
    (function () {
      setTimeout(function () {
        // 这儿并没有形成闭包，外面的立即执行函数加不加都一样
        console.log(i);
      }, i * 1000);
    })(i);
  } */

  for (var i = 0; i < 5; i++) {
    // for 循环第一次，走到定时器，瞬间执行立即执行函数，返回函数，形成闭包
    // for 循环第二次，走到定时器，瞬间执行立即执行函数，返回函数，形成闭包
    // ...

    setTimeout((function (i) {
      // console.log(i);
      return function () {
        console.log(i);
      }
    })(i), i * 1000);
  }
</script>